#!/usr/bin/env python
"""
Flask项目启动脚本（开发/生产环境通用）
使用方式：
  开发环境：python run.py --config dev --port 5000 --debug
  生产环境：python run.py --config prod --port 8000
"""

import argparse
from app import create_app


def validate_config(config_name):
    """验证配置名称合法性"""
    valid_configs = ['dev', 'prod', 'test']
    if config_name not in valid_configs:
        raise ValueError(f"无效的配置名称，可选值：{', '.join(valid_configs)}")


def check_production_safety(app):
    """生产环境安全检查"""
    if app.config['DEBUG']:
        raise RuntimeError("生产环境禁止开启DEBUG模式！")

    if app.config['SECRET_KEY'] in ['dev', 'default_secret']:
        raise ValueError("生产环境必须设置独立SECRET_KEY")


def main():
    # 解析命令行参数
    parser = argparse.ArgumentParser(description='启动Flask应用')
    parser.add_argument('--config', type=str, default='dev',
                        help='配置环境 (dev|prod|test)')
    parser.add_argument('--port', type=int, default=5000,
                        help='监听端口号 (默认: 5000)')
    parser.add_argument('--debug', action='store_true',
                        help='开启调试模式（生产环境自动禁用）')
    args = parser.parse_args()

    # 配置验证
    validate_config(args.config)

    # 创建应用实例
    app = create_app(config_name=args.config)

    # 生产环境安全检查
    if args.config == 'prod':
        check_production_safety(app)
        args.debug = False  # 强制关闭调试模式
        print("\033[33m警告: 生产环境建议使用Gunicorn部署，勿直接运行此脚本！\033[0m")

    # print("Registered URLs:")
    # for rule in app.url_map.iter_rules():
    #     print(f"Endpoint: {rule.endpoint}")
    #     print(f"URL: {rule.rule}")
    #     print(f"Methods: {rule.methods}\n")
    # 启动应用
    app.run(
        host='0.0.0.0',
        port=args.port,
        debug=args.debug,
        use_reloader=args.debug and args.config != 'prod'
    )


if __name__ == '__main__':
    main()
